package main

import "fmt"

// 类型断言
// 接口值是由一个具体类型和具体类型的值，称为接口的动态类型和动态值
// 如果我们想要判断空接口中值得类型，使用类型断言

/*
	x.(T)
	x: 表示类型为interface{}的变量
	T: 表示断言x可能是的类型
*/

// PrintType1 判断类型
func PrintType1(x interface{}) {
	if n, ok := x.(int); ok {
		fmt.Println(n)
		fmt.Println("为int类型")
	} else {
		fmt.Println(n)
		fmt.Println("不为int类型")
	}
}

// PrintType2 判断类型
func PrintType2(x interface{}) {
	switch x.(type) { // x.(type)只能用在switch中
	case int:
		fmt.Println("int类型")
	case string:
		fmt.Println("string类型")
	case bool:
		fmt.Println("布尔类型")
	default:
		fmt.Println("未找到该类型")
	}
}

func main() {
	// var a interface{}
	// a = "你好，golang"
	// v, ok := a.(string)
	// if ok {
	// 	fmt.Println("变量a为string类型，值为：", v)
	// } else {
	// 	fmt.Println("断言失败")
	// }

	// 断言应用
	PrintType1("你好Golang")
	PrintType1(20)
	PrintType2("20")
	PrintType2(20)
	PrintType2([]string{})
}
